#include "main.h"
#include "fft.h"
#include "adc.h"
#include "tim.h"
#include "stdio.h"

#include "arm_math.h"
#include "arm_const_structs.h"

Sigle sigle;

float32_t sf[NPT * 2] = {0}; // FFT结果 频域信号
float32_t max_value = 0;
uint32_t max_index = 0;

/**
 * @brief  信号参数计算函数 幅值 峰值 
 * @param  None
 * @retval None
 * @note   利用全局变量信号结构体 sigle
 */
void find_max_min() 
{
    sigle.ampl_max =0;
    sigle.ampl_min = 65536;
    for(uint16_t i = 0;i < NPT;i++)
    {
        if(adc_value[i] > sigle.ampl_max)
        {
            sigle.ampl_max = adc_value[i];
        }
        if(adc_value[i] < sigle.ampl_min)
        {
            sigle.ampl_min = adc_value[i];
        }
    }
    sigle.ampl_max = sigle.ampl_max * 3.3 / 65536;
    sigle.ampl_min = sigle.ampl_min * 3.3 / 65536;
    sigle.ampl = sigle.ampl_max - sigle.ampl_min;
   // printf("ampl_max = %.2f, ampl_min = %.2f, ampl = %.2f\r\n", sigle.ampl_max, sigle.ampl_min, sigle.ampl);
}
/**
 * @brief  FFT计算函数 得到频谱信息 频率 直流量
 * @param  None
 * @retval None
 * @note   利用全局变量信号结构体 sigle
 */
void fft_cal()
{
    if(TransferComplete==1)
    {

        for(u16 i = 0;i < NPT;i++)        
        {
            sf[i*2] = (float32_t)(adc_value[i])*3.3/65536;
            sf[i*2+1] = (float32_t)0.0;                                  //虚部为0
        }
        arm_cfft_f32(&arm_cfft_sR_f32_len512, sf, 0, 1);    // FFT
        arm_cmplx_mag_f32(sf, sigle.mag, NPT);           // 求解模值
        sigle.mag[0] /= NPT;              //模值归一化
        sigle.dc = sigle.mag[0];    //直流量
        for(u16 i = 1;i < NPT;i++)
        {
            sigle.mag[i] /= (NPT/2);
        }
        sigle.mag[0] = 0;
        for(u16 i = 0;i < NPT;i++)
        {
            printf("%f ",sigle.mag[i]);
        }
        arm_max_f32(sigle.mag, NPT/2, &max_value, &max_index); // 找出最大分量
        sigle.freq = (float32_t)max_index * (FRE / NPT); // FFT所得实际频率f=点数i*(采样频率F/总采样点数N)
        find_max_min();
        TransferComplete = 0;
        HAL_TIM_Base_Start(&htim3);  //重新打开定时器
    }
}

int data1[NPT];
int data2[NPT]; 
void diplay_load()
{   
    for(u16 i = 0;i < NPT;i++)
    {
        data1[i] = (int)(adc_value[i]/65536.0*256);
        if(i<NPT/2)
        {
            data2[i] = (int)(sigle.mag[i+NPT/2]*256);
            data2[i+NPT/2] = (int)(sigle.mag[i+NPT/2]*256);
        }

    }
}
void display_refesh()
{
    for(u16 i = 0;i < NPT;i++)
    {
        printf("add s0.id,0,%d\xff\xff\xff",(int)data1[i]);  //波形
        printf("add s1.id,0,%d\xff\xff\xff",(int)data2[i]);  //频谱
    }   
    printf("main.t1.txt=\"%.3fV\"\xff\xff\xff",sigle.ampl);         //幅值
    printf("main.t5.txt=\"%.3fV\"\xff\xff\xff",sigle.ampl_max);     //顶端值
    printf("main.t6.txt=\"%.3fV\"\xff\xff\xff",sigle.ampl_min);     //底端值
    printf("main.t10.txt=\"%.3fV\"\xff\xff\xff",sigle.dc);           //直流
    printf("main.t2.txt=\"%.0fHz\"\xff\xff\xff",sigle.freq);        //频率
}
u16 t = 0;
u16 diplay_index = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {

        if(t >= 100)
        {
            diplay_load();
            t = 0;
        }
        t++;
    }
}

